package DP;

/**
 * minCostClimbingStairs
 *https://leetcode.cn/problems/min-cost-climbing-stairs/
 给你一个整数数组 cost ，其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。
 一旦你支付此费用，即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。

示例 1：

输入：cost = [10,15,20]
输出：15
解释：你将从下标为 1 的台阶开始。
- 支付 15 ，向上爬两个台阶，到达楼梯顶部。
总花费为 15 。
示例 2：

输入：cost = [1,100,1,1,1,100,1,1,100,1]
输出：6
解释：你将从下标为 0 的台阶开始。
- 支付 1 ，向上爬两个台阶，到达下标为 2 的台阶。
- 支付 1 ，向上爬两个台阶，到达下标为 4 的台阶。
- 支付 1 ，向上爬两个台阶，到达下标为 6 的台阶。
- 支付 1 ，向上爬一个台阶，到达下标为 7 的台阶。
- 支付 1 ，向上爬两个台阶，到达下标为 9 的台阶。
- 支付 1 ，向上爬一个台阶，到达楼梯顶部。
总花费为 6 。
 */
public class minCostClimbingStairs {
    public static void main(String[] args) {
        int res = minCostClimbingStairs(new int[]{2,100,1,1,1,100,1,1,100,1});
        // 打印输出res
        System.out.println(res);
        
    }

    
/**
 * 计算爬楼梯的最小花费。
 * 给定一个整数数组 cost，其中 cost[i] 表示到达第 i 阶楼梯的代价。现在，你从底部开始爬楼梯，每次可以爬 1 或 2 阶。你需要找到从底部爬到顶部的最小花费。
 * 
 * @param cost 表示每个阶梯的代价的整数数组。
 * @return 返回从底部爬到顶部的最小花费。
 */
public static int minCostClimbingStairs(int[] cost) {
    // 创建一个数组 dp 用于存储到达每个阶梯的最小花费。
    int []dp = new int[cost.length + 1];
    // 初始化前两个阶梯的最小花费为 0，因为可以选择不爬这两个阶梯。
    dp[0] = 0;
    dp[1] = 0;
    // 从第三个阶梯开始计算最小花费。
    for(int i = 2; i <= cost.length; i++){
        // 对于每个阶梯 i，选择从阶梯 i-1 爬上来或者从阶梯 i-2 爬上来，选取花费较小的。
        dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
    }
    // 返回到达顶部的最小花费，即最后一个阶梯的最小花费。
    return dp[cost.length];
}
}